/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja.de.trabajo.pkg5;
import java.util.Scanner;
import java.util.InputMismatchException;
import java.util.List;
import java.util.ArrayList;
/**
 *
 * @author RAUL
 */
public class HojaDeTrabajo5 {
    static List<Ingreso> ArrayClientes = new ArrayList<Ingreso>();
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        AbstractCola<Ingreso> Caja1= new ListaCircular<Ingreso>();
        AbstractCola<Ingreso> Caja2= new ListaCircular<Ingreso>();
        AbstractCola<Ingreso> Caja3= new ListaCircular<Ingreso>();
        AbstractCola<Ingreso> Caja4= new ListaCircular<Ingreso>();
        
        
        int ingreso;
        int[] cajas = new int[4];
        do{
        menu();
        
        
        ingreso = (int)obtenerNumero("¿Que opcioon desea realizar?",true);
        switch(ingreso){
            case 1:
                   Caja1 = new Lista<Ingreso>(); 
                   Caja2 = new Lista<Ingreso>();
                   Caja3 = new Lista<Ingreso>();
                   Caja4 = new Lista<Ingreso>();
                break;
            case 2:
                   Caja1 = new ListaCircular<Ingreso>(); 
                   Caja2 = new ListaCircular<Ingreso>();  
                   Caja3 = new ListaCircular<Ingreso>();  
                   Caja4 = new ListaCircular<Ingreso>();  
                break;
            case 3:
                   int cant = (int)obtenerNumero("¿Cuantos clientes desa ingresar?",true);
                   for (int i=0;i<cant;i++){
                Ingreso cliente = new Ingreso();
                ArrayClientes.add(cliente);
                cliente.setEntrada((int)obtenerNumero("Ingrese el tiempo de entrada para Cliente"+(i+1),true));
                cliente.setTransac();
                cliente.setCaja(2);
                }
                for(int y=0;y<ArrayClientes.size();y++){
                    Ingreso cli0 = ArrayClientes.get(y);
                    cli0.setEspera(calcTiemp(y));
                    cli0.setTotal();
                    Ingreso cliente1 = null;
                    Ingreso cliente2 = null;
                    Ingreso cliente3 = null;
                    Ingreso cliente4 = null;
                    int menor = 0;
                    if(!Caja1.isEmpty()) cliente1 = Caja1.peek();
                    if(!Caja2.isEmpty()) cliente2 = Caja2.peek();
                    if(!Caja3.isEmpty()) cliente3 = Caja1.peek();
                    if(!Caja4.isEmpty()) cliente4 = Caja2.peek();
                    try{
                    if(cli0.getEntrada()>cliente1.getTot()) Caja1.poll(); cliente1.setEstado(1);
                    if(cli0.getEntrada()>cliente2.getTot()) Caja2.poll(); cliente2.setEstado(1);
                    if(cli0.getEntrada()>cliente3.getTot()) Caja3.poll(); cliente3.setEstado(1);
                    if(cli0.getEntrada()>cliente4.getTot()) Caja4.poll(); cliente4.setEstado(1);
                    }
                    catch(NullPointerException e){}
                    
                    cajas[0]=Caja1.size();
                    cajas[1]=Caja2.size();
                    cajas[2]=Caja3.size();
                    cajas[3]=Caja4.size();
                    menor = getMinValue(cajas)+1;
                    System.out.println(menor);
                    switch(menor){
                        case 1:
                                cli0.setCaja(menor);
                                Caja1.offer(cli0);
                                
                                System.out.println();
                                System.out.println("Se ingreso un cliente en el tiempo: "+cli0.getEntrada());
                                System.out.println("El tiemo de transac es: "+cli0.getTransac());
                                System.out.println("El cliente se ingreso a la caja: "+cli0.getCaja());
                                break;
                        case 2:
                                cli0.setCaja(menor);
                                Caja2.offer(cli0);
                                
                                System.out.println("Se ingreso un cliente en el tiempo: "+cli0.getEntrada());
                                System.out.println();
                                System.out.println("El cliente se ingreso a la caja: "+cli0.getCaja());
                                break;
                        case 3:
                                cli0.setCaja(menor);
                                Caja3.offer(cli0);
                                System.out.println("Se ingreso un cliente en el tiempo: "+cli0.getEntrada());
                                System.out.println();
                                System.out.println("El cliente se ingreso a la caja: "+cli0.getCaja());
                                break;
                        case 4: 
                                cli0.setCaja(menor);
                                Caja4.offer(cli0);
                                System.out.println("Se ingreso un cliente en el tiempo: "+cli0.getEntrada());
                                System.out.println();
                                System.out.println("El cliente se ingreso a la caja: "+cli0.getCaja());
                                break; 
                    }
                    
                   
                }
           
        }
        }while(ingreso != 4);
        
        
    }
    
    public static void menu(){
        System.out.println();
        System.out.println("-------------- Menu Principal --------------");
        System.out.println(                                              );
        System.out.println(" 1. Usar  Arreglos.                         ");
        System.out.println(" 2. Usar Lista Circular.                    ");
        System.out.println(" 3. Ingresar Clientes.                      ");
        System.out.println(" 4. Salir.                                  ");
        System.out.println("--------------------------------------------");
    }
    
        public static double obtenerNumero(String mensaje, boolean mostrar){
        Scanner ingreso = new Scanner(System.in);
        double num = -1;
        
        System.out.print(mensaje);
        try{
            num = ingreso.nextDouble();
        }
        catch(InputMismatchException exception){
            if (mostrar)
                System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
        }
        finally{
            ingreso.nextLine();//Atrapar el ENTER
        }
        return num;
        }
      
      public static int calcTiemp(int ind){
          int ca=0;
          Ingreso clien2 = ArrayClientes.get(ind);
          Ingreso clien;
          int cajaa = clien2.getCaja();
          int result=0;
          for(int otro=ind-1;otro>0;otro--){
              clien = ArrayClientes.get(otro);
              ca = clien.getCaja();
              if(ca==cajaa) {
                  result += clien2.getTransac();
              }
          }
          return result;
      }  
        
      public static int getMinValue(int[] numbers){  
        int minValue = numbers[0]; 
        int ret=0;
        for(int i=1;i<numbers.length;i++){  
            if(numbers[i] < minValue){  
                minValue = numbers[i];
                ret = i;
            }  
        }  
        return ret;  
    }  
        
}

